package component

import "fmt"

// NodeParamsType 定义了节点参数的类型，用于节点配置中参数的类型标识。
// Types
type NodeParamsType string

const (
	AsyncOptions NodeParamsType = "asyncOptions" // 异步选项
	Options      NodeParamsType = "options"      // 选项
	MultiOptions NodeParamsType = "multiOptions" // 多选项
	DataGrid     NodeParamsType = "datagrid"     // 数据网格
	String       NodeParamsType = "string"       // 字符串
	Number       NodeParamsType = "number"       // 数字
	Boolean      NodeParamsType = "boolean"      // 布尔值
	Password     NodeParamsType = "password"     // 密码
	Json         NodeParamsType = "json"         // JSON
	Code         NodeParamsType = "code"         // 代码
	Date         NodeParamsType = "date"         // 日期
	File         NodeParamsType = "file"         // 文件
	Folder       NodeParamsType = "folder"       // 文件夹
)

// CommonType 作为一个通用接口，定义了组件间通用数据类型的交互。
type CommonType interface {
	string | int | bool
}

// 定义一个函数，接受满足 CommonTypeConstraint 的类型参数
func printCommonType[T CommonType](v T) {
	fmt.Printf("Value: %v, Type: %T\n", v, v)
}

// 定义一个函数，接受 *T 类型参数，允许传入 nil
func printNilCommonType[T CommonType](v *T) {
	if v != nil {
		fmt.Printf("Value: %v, Type: %T\n", *v, *v)
	} else {
		fmt.Println("Value is nil")
	}
}

// MessageType 定义了消息的类型，用于区分不同来源或处理方式的消息。
type MessageType string

const (
	ApiMessage  MessageType = "apiMessage"  // API消息
	UserMessage MessageType = "userMessage" // 用户消息
)

// ImageDetail 定义了图片详情的级别，用于控制图片显示的详细程度。
type ImageDetail string

const (
	Auto ImageDetail = "auto" // 自动
	Low  ImageDetail = "low"  // 低
	High ImageDetail = "high" // 高
)

// ICommonObject 作为一个通用的数据结构，用于存储任意类型的键值对数据。
type ICommonObject map[string]interface{}

// IVariable 定义了一个变量的结构，包括变量名、值和类型。
type IVariable struct {
	Name  string
	Value string
	Type  string
}

// IDatabaseEntity 作为一个数据库实体的接口，定义了与数据库交互的通用数据结构。
type IDatabaseEntity map[string]interface{}

// IAttachment 定义了附件的结构，包括内容、内容类型、大小和文件名。
type IAttachment struct {
	Content     string
	ContentType string
	Size        int
	Filename    string
}

// INodeOptionsValue 定义了节点选项的结构，包括标签、名称和描述。
type INodeOptionsValue struct {
	Label       string
	Name        string
	Description string
}

// INodeOutputsValue 定义了节点输出的结构，包括标签、名称、基类和描述。
type INodeOutputsValue struct {
	Label       string
	Name        string
	BaseClasses []string
	Description string
}

// INodeParams 定义了节点参数的结构，包括标签、名称、类型、默认值和描述等配置信息。
type INodeParams struct {
	Label            string
	Name             string
	Type             NodeParamsType
	Default          interface{}
	Description      string
	Warning          string
	Options          []INodeOptionsValue
	DataGrid         []ICommonObject
	CredentialNames  []string
	Optional         bool
	Step             int
	Rows             int
	List             bool
	AcceptVariable   bool
	Placeholder      string
	FileType         string
	AdditionalParams bool
	LoadMethod       string
	Hidden           bool
	Variables        []ICommonObject
}

// INodeExecutionData 定义了节点执行数据的结构，用于存储节点执行过程中的数据。
type INodeExecutionData map[string]interface{}

// INodeDisplay 定义了节点显示的结构，用于控制节点的可视化表现。
type INodeDisplay map[string]interface{}

// INodeProperties 定义了节点属性的结构，包括标签、名称、类型和描述等基本信息。
type INodeProperties struct {
	Label       string
	Name        string
	Type        string
	Icon        string
	Version     int
	Category    string
	BaseClasses []string
	Tags        []string
	Description string
	FilePath    string
	Badge       string
}

// INode 结合INodeProperties，定义了节点的完整结构，包括输入、输出和属性等。
type INode struct {
	INodeProperties
	Inputs []INodeParams
	Output []INodeOutputsValue
	// Methods and other properties would be defined here
}

// INodeData 定义了节点数据的结构，包括ID、输入、输出、凭据和实例等信息。
type INodeData struct {
	ID         string
	Inputs     ICommonObject
	Outputs    ICommonObject
	Credential string
	Instance   interface{}
	LoadMethod string
}

// INodeCredential 定义了节点凭据的结构，包括标签、名称和描述等信息。
type INodeCredential struct {
	Label       string
	Name        string
	Description string
	Inputs      []INodeParams
}

// IMessage 定义了消息的结构，包括消息内容和类型。
type IMessage struct {
	Message string
	Type    MessageType
}

// IUsedTool 定义了使用工具的结构，包括工具名称、输入和输出等信息。
type IUsedTool struct {
	Tool       string
	ToolInput  interface{}
	ToolOutput interface{}
}

// IFileUpload 定义了文件上传的结构，包括数据、类型、名称和MIME类型等信息。
type IFileUpload struct {
	Data string
	Type string
	Name string
	Mime string
}

// IMultiModalOption 定义了多模态选项的结构，包括图像和音频等信息。
type IMultiModalOption struct {
	Image ICommonObject
	Audio ICommonObject
}

// MessageContentText 定义了文本消息内容的结构。
type MessageContentText struct {
	Type string
	Text string
}

// MessageContentImageUrl 定义了图片消息内容的结构，包括URL和详细程度等信息。
type MessageContentImageUrl struct {
	Type     string
	ImageURL string
	Detail   ImageDetail
}

// PromptTemplate 作为提示模板的结构，用于存储提示信息的值。
type PromptTemplate struct {
	promptValues ICommonObject
}

// NewPromptTemplate 创建一个新的PromptTemplate实例。
func NewPromptTemplate(input interface{}) *PromptTemplate {
	return &PromptTemplate{}
}

// PromptRetriever 作为提示检索器的结构，用于获取提示信息。
type PromptRetriever struct {
	Name          string
	Description   string
	SystemMessage string
}

// NewPromptRetriever 创建一个新的PromptRetriever实例。
func NewPromptRetriever(fields struct {
	Name          string
	Description   string
	SystemMessage string
}) *PromptRetriever {
	return &PromptRetriever{
		Name:          fields.Name,
		Description:   fields.Description,
		SystemMessage: fields.SystemMessage + "{input}",
	}
}

// VectorStoreRetriever 作为向量存储检索器的结构，用于获取向量存储信息。
type VectorStoreRetriever struct {
	Name        string
	Description string
	VectorStore interface{}
}

// NewVectorStoreRetriever 创建一个新的VectorStoreRetriever实例。
func NewVectorStoreRetriever(fields struct {
	Name        string
	Description string
	VectorStore interface{}
}) *VectorStoreRetriever {
	return &VectorStoreRetriever{
		Name:        fields.Name,
		Description: fields.Description,
		VectorStore: fields.VectorStore,
	}
}

// MemoryMethods 定义了记忆方法的接口，包括获取、添加和清除聊天消息等操作。
type MemoryMethods interface {
	GetChatMessages(overrideSessionId string, returnBaseMessages bool, prevHistory []IMessage) []IMessage
	AddChatMessages(msgArray []struct {
		Text string
		Type MessageType
	}, overrideSessionId string)
	ClearChatMessages(overrideSessionId string)
}

// LiliMemory 作为Lili记忆的实现，符合MemoryMethods接口。
type LiliMemory interface {
	MemoryMethods
}

// IVisionChatModal 定义了视觉聊天模态的接口，包括设置视觉模型和多模态选项等操作。
type IVisionChatModal interface {
	SetVisionModel()
	RevertToOriginalModel()
	SetMultiModalOption(multiModalOption IMultiModalOption)
}

// Implementations would go here...
